package com.spring.springtx.test01;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;

/**
 * spring 事务
 * 环境搭建
 *1、导入相关依赖：
 *      数据源、数据库驱动、spring-jdbc模块
 * 2、配置数据源：
 *       JdbcTemplate 操作数据库
 * 3、给方法上标注@Transactional 表示当前方法是一个事务方法
 * 4、@EnableTransactionManagement 开启基于注解的事务管理功能
 * 5、配置事务管理器管理事务
 *      PlatformTransactionManager
 */
@EnableTransactionManagement
@ComponentScan(basePackages = "com.spring.springtx.test01")
@Configuration
public class TxConfig {

	@Bean
	public DataSource dataSource() throws PropertyVetoException {
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		dataSource.setUser("root");
		dataSource.setPassword("123456");
		dataSource.setDriverClass("com.mysql.jdbc.Driver");
		dataSource.setJdbcUrl("jdbc:mysql://192.168.0.150:3306/test");
		return dataSource;
	}

	@Bean
	public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
		//spring 对@Configuration 类会特殊处理，给容器中加组件的方法，多次调用都只是从容器中找组件，不会新创建组件
		return new JdbcTemplate(dataSource());
	}

	//注册事务管理器
	@Bean
	public PlatformTransactionManager transactionManager() throws PropertyVetoException {
		return new DataSourceTransactionManager(dataSource());
	}
}
